#include <iostream>
#include <thread>
#include <mutex>
using namespace std;


/*虽然递归互斥锁可以解决同一个互斥锁频繁获取互斥锁资源的问题，但是还是建议少用，主要原因如下：
使用递归互斥锁的场景往往都是可以简化的，使用递归互斥锁很容易放纵复杂逻辑的产生，从而导致bug的产生
递归互斥锁比非递归互斥锁效率要低一些。
递归互斥锁虽然允许同一个线程多次获得同一个互斥锁的所有权，但最大次数并未具体说明，一旦超过一定的次数，就会抛出std::system错误。
*/
//using _Mutex_Type=mutex;
using _Mutex_Type=recursive_mutex;
_Mutex_Type m_mutex;

class Calculate
{
public:
    Calculate() : m_i(6) {}

    void mul(int x)
    {
        lock_guard<_Mutex_Type> locker(m_mutex);
        m_i *= x;
    }

    void div(int x)
    {
        lock_guard<_Mutex_Type> locker(m_mutex);
        m_i /= x;
    }

    void both(int x, int y)
    {
        lock_guard<_Mutex_Type> locker(m_mutex);
        mul(x);
        div(y);
        cout <<"m_i:"<<m_i<<endl;
    }

    int m_i;
    
};

int main()
{
    //Calculate<recursive_mutex> cal;
    Calculate cal;
    //cal.both(6, 3);
    int a,b;
    thread th(&Calculate::both, cal,6,3);//拷贝构建了Calculate对象
    //thread th(&Calculate::both, &cal,6,3);//拷贝构建了Calculate对象
    //thread th(&Calculate::both, std::ref(cal),6,3);//拷贝构建了Calculate对象
    cout << "cal.m_i = " << cal.m_i << endl;
    th.join();
    return 0;
}

/* 
作者: 苏丙榅
链接: https://subingwen.cn/cpp/mutex/
来源: 爱编程的大丙
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。 */